package com.hang.ad.mysql.dto;

import com.hang.ad.mysql.constant.OpType;
import lombok.Data;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Supplier;

@Data
public class ParseTemplate {
    private String database;
    private Map<String, TableTemplate> tableTemplateMap = new HashMap<>();

    public static ParseTemplate parse(Template _template){
        ParseTemplate parseTemplate = new ParseTemplate();
        parseTemplate.setDatabase(_template.getDatabase());

        for (JsonTable jsonTable : _template.getTableList()) {
            TableTemplate tableTemplate = new TableTemplate();
            tableTemplate.setLevel(jsonTable.getLevel().toString());
            tableTemplate.setTableName(jsonTable.getTableName());
            parseTemplate.tableTemplateMap.put(jsonTable.getTableName(), tableTemplate);

            Map<OpType, List<String>> opTypeFieldSetMap = tableTemplate.getOpTypeFieldSetMap();
            for (JsonTable.Column column : jsonTable.getInsert()) {
                getAndCreateIfNeed(OpType.ADD, opTypeFieldSetMap, ArrayList::new).add(column.getColumn());
            }

            for (JsonTable.Column column : jsonTable.getUpdate()) {
                getAndCreateIfNeed(OpType.UPDATE, opTypeFieldSetMap, ArrayList::new).add(column.getColumn());
            }

            for (JsonTable.Column column : jsonTable.getDelete()){
                getAndCreateIfNeed(OpType.DELETE, opTypeFieldSetMap, ArrayList::new).add(column.getColumn());
            }
        }
        return parseTemplate;
    }

    private static <T, R> R getAndCreateIfNeed(T key, Map<T, R> map, Supplier<R> factory){
        return map.computeIfAbsent(key, k-> factory.get());
    }
}
